//
//  RACMap.m
//  ReactiveCocoa
//
//  Created by apple on 2017/9/11.
//  Copyright © 2017年 apple. All rights reserved.
//

#import "RACMap.h"
#import <ReactiveObjC/ReactiveObjC.h>
#import "RACReturnSignal.h"
@interface RACMap ()

@end

@implementation RACMap

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    
    self.view.backgroundColor = [UIColor whiteColor];
    
#pragma 绑定信号 - 可以对信号进行处理后 再订阅 - 这个做什么用呢？ - 处理好数据发送出去/发送数据出去再处理？ - 前者方便一点吧？
#pragma 这个和bind一样的作用 - 只不过bind属于底层的  - map封装bind
    

#pragma Map使用
    
    //Map使用更加简单了
    // 1.创建信号
    RACSubject *subject = [RACSubject subject];
    
    // 2.绑定信号 - 使用map映射 ， 相对于bind和flattenmap 更加简单 - 返回值不在是一个信号，而是你发送的信号内容，再经过处理的数据
    RACSignal *bindSignal = [subject map:^id _Nullable(id  _Nullable value) {
       
        
        //这里直接返回value - 不再是信号了（[RACReturnSignal return:value]）
        //跟bind和flattenmap一样，处理value数据,返回
        value = [NSString stringWithFormat:@"wt:%@",value];
        return value;
    }];
    
    
    // 订阅信号
    [bindSignal subscribeNext:^(id  _Nullable x) {
       
        NSLog(@"x = %@",x);
    }];
    
    
    // 发送信号数据
    [subject sendNext:@1];
}


#pragma flattenMap使用
- (void)flattenMap{

    // 1.创建信号
    RACSubject *subject = [RACSubject subject];
    
    // 2.绑定信号
    RACSignal *bindSignal = [subject flattenMap:^__kindof RACSignal * _Nullable(id  _Nullable value) {
        
        
        // value是源信号（subject）发送的数据 - 在这个block里对数据进行操作
        
        
        // 将value包装成一个信号返回
        return [RACReturnSignal return:value];
        
        
    }];
    
    // 3.订阅信号 - flattenmap返回的是什么信号，订阅的就是什么信号
    [bindSignal subscribeNext:^(id  _Nullable x) {
        
        //接收到的是处理好的value 数据
        NSLog(@"x = %@",x);
    }];
    
    
    // 4.源信号发送信号
    [subject sendNext:@1];
    

}

@end
